home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 2
/
Atari Mega Archive CD - Volume 2.iso
/
8bit
/
cislib_b
/
qset.asm
< prev
next >
Wrap
Assembly Source File
|
1995-04-22
|
6KB
|
264 lines
.TITLE "PERCOM QUICK SET 05-27-85"
;
;SAVE#D:QSET.M65
;
; This program switches the density for
; PERCOM compatible drives.
; Drive numbers allowed are 1 through 8.
; Allowed settings are:
; S = single
; E = enhanced (1050)
; D = double
; DD = double sided, double density
; Command format example:
;
; QSET 1D 7E 3DD
;
; At least one space after QSET is
; required. The rest of the command line
; ignores anything other than a number
; in the range 1 through 8 followed by
; an upper case D, E, or S. Thus,
; equivalent examples are:
;
; QSET 1D7E3DD
; QSET 31DXYZ7E 3DD
;
; When the program terminates, it echoes
; to the screen the valid portions of
; the command line. The last example
; would echo:
;
; 1D 7E 3DD
;
; If a drive cannot be configured, the
; last letter is replaced with a
; question mark.
;
; NOTES:
; 1. Enhanced (1050) allows
; you to read or write 1050
; density disks, but does
; not allow you to format
; disks in that density.
; 2. As with any other SIO
; use, the 28 second timeout
; may occasionally occur.
;
; I wish to credit DANIEL L. MOORE
; for his SET.ASM, from which the
; central routine of this program was
; adapted.
;
******************************
* *
* Josef W. Segur 05/27/85 *
* *
******************************
;
DOSVEC = $0A
DOSINIT = $07E0 FMS v. 2
FR0 = $D4 FP register 0
DENSITY = FR0+2
;
; OS/A+ equates
CPBUFP = $0A next char.
CPCMDB = $3F command buff.
; SIO equates
DDEVIC = $0300
DUNIT = $0301
DCOMND = $0302
DSTATS = $0303
DBUFLO = $0304
DBYTLO = $0308
; Data direction control
IN = $40
OUT = $80
; CIO equates
ICHID = $0340
ICCOM = $0342
ICBAL = $0344
ICBAH = $0345
ICBLL = $0348
ICBLH = $0349
;
PUTBYTS = $0B
; PERCOM drive table
READ = $4E
WRITE = $4F
LENGTH = 12
FM = 0 FM recording
MFM = 4 MFM recording
SID1 = 0 One side
SID2 = 1 Two sides
;
CIO = $E456
SIO = $E459
;
EOL = $9B End of line char.
;
*= $4000
;
START CLC
LDY #CPBUFP
LDA (DOSVEC),Y
ADC #CPCMDB+1 ;skip 1st space
STA CMDBIX
STA FIRSTX
SEC
LDA # <EBUF
SBC FIRSTX
STA FR0
LDA # >EBUF
SBC #0
STA FR0+1
LDA #EOL
STA EBUF
LOOP LDY CMDBIX
INC CMDBIX
BMI DOS ;out if too long
LDA (DOSVEC),Y ;Get char
CMP #EOL
BEQ DOS ;out if end
STA (FR0),Y ;save for echo?
; Test for drive 1 to 8.
EOR #'0
CMP #$09
BCC NUM ;BR if 1 - 8
SPLP LDA #32 ;Else space
STA (FR0),Y
JMP LOOP ;and check next
NUM STA DUNIT
LDA #$31
STA DDEVIC
; Test for S(0), E(1), D(2), DD(3)
LDX #0
INY
LDA (DOSVEC),Y
CMP #EOL
BEQ DOS ;out if end
CMP #'S
BEQ SETIT
INX
CMP #'E
BEQ SETIT
INX
CMP #'D
BEQ SECD ;Chk 2nd D
DEY ;letter bad
BNE SPLP ;clr number & next
SECD STA (FR0),Y
INY
LDA (DOSVEC),Y
CMP #'D
BEQ DDYS
DEY ;whoops
LDA #'D
BNE SETIT
DDYS INX
BNE SETIT
;
DOS LDA #EOL
STA (FR0),Y
STY CMDBIX
JSR DOSINIT ;reinit for all changes
LDA ICHID
BMI DRTS ;BR IOCB#0 not open
LDA #PUTBYTS
STA ICCOM ;Else echo cmds
LDA # <EBUF
STA ICBAL ;from EBUF
LDA # >EBUF
STA ICBAH
LDX #0
SEC
LDA CMDBIX
SBC FIRSTX
STA ICBLL ;len end - start
STX ICBLH
JSR CIO
DRTS RTS
;
SETIT STX DENSITY
STA (FR0),Y ;save letter
INY
STY CMDBIX ;& index past it
; First read in the current
; control table.
LDA #IN
STA DSTATS
LDA #READ
STA DCOMND
LDA #LENGTH
STA DBYTLO
LDA #0
STA DBYTLO+1
LDA # <TABLE
STA DBUFLO
LDA # >TABLE
STA DBUFLO+1
JSR SIO
BPL DENS cont if no error
LDY CMDBIX
DEY
LDA #'?
STA (FR0),Y else insert ?
JMP LOOP and loop for more
;
; Modify the control bytes
; First recording technique
DENS LDA DENSITY
BNE SET.MFM
LDX #FM
BEQ SET
SET.MFM LDX #MFM
SET STX TABLE+5
; Then set the sector length
CMP #2
BCS S.256
LDX #$80 128 bytes
LDY #$00
BEQ SETLEN
S.256 LDX #$00 256 bytes
LDY #$01
SETLEN STY TABLE+6 High byte
STX TABLE+7 Low byte
; Then set the number of
; sectors per track.
CMP #1
BEQ S.26
LDX #18 18 sectors
BNE SETSECT
S.26 LDX #26 26 sectors
SETSECT STX TABLE+3
; Set the number of sides
CMP #3
BEQ S.DBL
LDX #SID1
BEQ SETSID
S.DBL LDX #SID2
SETSID STX TABLE+4
; Then write the table out.
LDA #OUT
STA DSTATS
LDA #WRITE
STA DCOMND
JSR SIO
; Loop for any more requests
JMP LOOP
;
CMDBIX = * ;reserve index byte store
*= *+1
;
FIRSTX = * ;reserve start index store
*= *+1
;
; DRIVE table.
TABLE = *
*= *+LENGTH
;
EBUF = *
*= *+128 ;reserve
;
END .OPT LIST
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^